/*
 * Copyright 2022 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.mx.ymate.satoken;

import cn.dev33.satoken.config.SaTokenConfig;
import net.ymate.platform.core.beans.annotation.Ignored;
import net.ymate.platform.core.support.IInitialization;

/**
 * ISaTokenConfig generated By ModuleMojo on 2022/07/03 12:39
 *
 * @author YMP (https://www.ymate.net/)
 */
@Ignored
public interface ISaTokenConfig extends IInitialization<ISaToken> {

    String ENABLED = "enabled";

    String TOKEN_NAME = "tokenName";

    String TIMEOUT = "timeout";

    String ACTIVITY_TIMEOUT = "activityTimeout";

    String IS_CONCURRENT = "isConcurrent";

    String IS_SHARE = "isShare";

    String MAX_LOGIN_COUNT = "maxLoginCount";

    String IS_READ_BODY = "isReadBody";

    String IS_READ_HEADER = "isReadHeader";

    String IS_READ_COOKIE = "isReadCookie";

    String IS_WRITE_HEADER = "isWriteHeader";

    String TOKEN_STYLE = "tokenStyle";

    String DATA_REFRESH_PERIOD = "dataRefreshPeriod";

    String TOKEN_SESSION_CHECK_LOGIN = "tokenSessionCheckLogin";

    String AUTO_RENEW = "autoRenew";

    String TOKEN_PREFIX = "tokenPrefix";

    String IS_PRINT = "isPrint";

    String IS_LOG = "isLog";

    String LOG_LEVEL = "logLevel";
    String LOG_LEVEL_INT = "logLevelInt";

    String JWT_SECRET_KEY = "jwtSecretKey";

    String BASIC = "basic";

    String CURR_DOMAIN = "currDomain";
    String SAME_TOKEN_TIMEOUT = "sameTokenTimeout";

    String COOKIE_DOMAIN = "cookieDomain";

    String COOKIE_PATH = "cookiePath";

    String COOKIE_SECURE = "cookieSecure";

    String COOKIE_HTTP_ONLY = "cookieHttpOnly";

    String COOKIE_SAME_SITE = "cookieSameSite";

    /**
     * 模块是否已启用, 默认值: true
     *
     * @return 返回false表示禁用
     */
    boolean isEnabled();

    /**
     * token名称 (同时也是cookie名称)
     */
    String tokenName();

    /**
     * token的长久有效期(单位:秒) 默认30天, -1代表永久
     */
    long timeout();

    /**
     * token临时有效期 [指定时间内无操作就视为token过期] (单位: 秒), 默认-1 代表不限制
     * (例如可以设置为1800代表30分钟内无操作就过期)
     */
    long activityTimeout();

    /**
     * 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
     */
    Boolean isConcurrent();

    /**
     * 在多人登录同一账号时，是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
     */
    Boolean isShare();

    /**
     * 同一账号最大登录数量，-1代表不限 （只有在 isConcurrent=true, isShare=false 时此配置才有效）
     */
    int maxLoginCount();

    /**
     * 是否尝试从请求体里读取token
     */
    Boolean isReadBody();

    /**
     * 是否尝试从header里读取token
     */
    Boolean isReadHeader();

    /**
     * 是否尝试从cookie里读取token
     */
    Boolean isReadCookie();

    /**
     * 是否在登录后将 Token 写入到响应头
     */
    Boolean isWriteHeader();

    /**
     * token风格(默认可取值：uuid、simple-uuid、random-32、random-64、random-128、tik)
     */
    String tokenStyle();

    /**
     * 默认dao层实现类中，每次清理过期数据间隔的时间 (单位: 秒) ，默认值30秒，设置为-1代表不启动定时清理
     */
    int dataRefreshPeriod();

    /**
     * 获取[token专属session]时是否必须登录 (如果配置为true，会在每次获取[token-session]时校验是否登录)
     */
    Boolean tokenSessionCheckLogin();

    /**
     * 是否打开自动续签 (如果此值为true, 框架会在每次直接或间接调用getLoginId()时进行一次过期检查与续签操作)
     */
    Boolean autoRenew();

    /**
     * token前缀, 格式样例(satoken: Bearer xxxx-xxxx-xxxx-xxxx)
     */
    String tokenPrefix();

    /**
     * 是否在初始化配置时打印版本字符画
     */
    Boolean isPrint();

    /**
     * 是否打印操作日志
     */
    Boolean isLog();

    /**
     * 日志等级（trace、debug、info、warn、error、fatal）
     */
    String logLevel();

    /**
     * 日志等级 int 值（1=trace、2=debug、3=info、4=warn、5=error、6=fatal）
     */
    int logLevelInt();

    /**
     * jwt秘钥 (只有集成 jwt 模块时此参数才会生效)
     */
    String jwtSecretKey();


    /**
     * Http Basic 认证的账号和密码
     */
    String basic();

    /**
     * 配置当前项目的网络访问地址
     */
    String currDomain();

    /**
     * Same-Token 的有效期 (单位: 秒)
     */
    long sameTokenTimeout();

    /**
     * 是否校验Same-Token（部分rpc插件有效
     */
    Boolean checkSameToken();

    /**
     * 域（写入Cookie时显式指定的作用域, 常用于单点登录二级域名共享Cookie的场景）
     */
    String cookieDomain();

    /**
     * 路径
     */
    String cookiePath();

    /**
     * 是否只在 https 协议下有效
     */
    Boolean cookieSecure();

    /**
     * 是否禁止 js 操作 Cookie
     */
    Boolean cookieHttpOnly();

    /**
     * 第三方限制级别（Strict=完全禁止，Lax=部分允许，None=不限制）
     */
    String cookieSameSite();

    /**
     * 转换satoken配置
     *
     * @return
     */
    SaTokenConfig toSaTokenConfig();
}